Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核调试

帖子发起人: holly   发起时间: 2008-10-14 16:58 下午   回复: 1

Print Search
帖子排序:    
   2008-10-14, 16:58 下午
hollyhunter 离线,最后访问时间: 2009/10/10 9:42:36 holly

发帖数前50位
注册: 2008-07-14
发 贴: 22
Sleep [|-)] 想了解不同的驱动类型ID导致的影响是什么?
Reply Quote

写过驱动的应该知道CTL_CODE这个宏,以及IoCreateDevice驱动函数。
一直不是很清楚CTL_CODE中的第一个参数DeviceType以及IoCreateDevice中使用的DeviceType之间的关系以及对驱动的影响。
有人能够清楚的说明这个Type会影响什么吗?

比如,我在CTL_CODE以及IoCreateDevice中使用FILE_DEVICE_UNKNOWN和FILE_DEVICE_DISK_FILE_SYSTEM到底会产生什么样的不同,系统会怎样区别对待?



 


IP 地址: 已记录   报告
   2008-10-15, 22:41 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 想了解不同的驱动类型ID导致的影响是什么?
Reply Quote
准确的说是设备类型ID,不是驱动类型ID,尽管大多数驱动程序都是只创建和为一种类型的设备服务。设备类型ID的作用是标志设备实例所属的类型,它会被始终保存在设备对象的DeviceType字段中。
例如以下是磁盘设备实例的DEVICE_OBJECT结构:
lkd> dt _DEVICE_OBJECT 0x8a81b940
nt!_DEVICE_OBJECT
+0x000 Type : 3
+0x002 Size : 0x234
+0x004 ReferenceCount : 0
+0x008 DriverObject : 0x8a851220 _DRIVER_OBJECT
+0x00c NextDevice : 0x8a827030 _DEVICE_OBJECT
+0x010 AttachedDevice : 0x8a81a9e8 _DEVICE_OBJECT
+0x014 CurrentIrp : (null)
+0x018 Timer : (null)
+0x01c Flags : 0x5050
+0x020 Characteristics : 0x100
+0x024 Vpb : (null)
+0x028 DeviceExtension : 0x8a81b9f8
+0x02c DeviceType : 7
+0x030 StackSize : 1 ''
+0x034 Queue : __unnamed
+0x05c AlignmentRequirement : 1
+0x060 DeviceQueue : _KDEVICE_QUEUE
+0x074 Dpc : _KDPC
+0x094 ActiveThreadCount : 0
+0x098 SecurityDescriptor : 0xe18b81c8
+0x09c DeviceLock : _KEVENT
+0x0ac SectorSize : 0
+0x0ae Spare1 : 1
+0x0b0 DeviceObjectExtension : 0x8a81bb78 _DEVOBJ_EXTENSION
+0x0b4 Reserved : (null)
其中DeviceType字段为7,代表FILE_DEVICE_DISK(参见http://www.osronline.com/DDKx/kmarch/devobjts_5hnr.htm
)。
!devobj扩展命令也会显示设备类型:
lkd> !devobj 0x8a81b940
Device object (8a81b940) is for:
IdeDeviceP0T0L0-3 \Driver\atapi DriverObject 8a851220
Current Irp 00000000 RefCount 0 Type 00000007 Flags 00005050
Dacl e18b81dc DevExt 8a81b9f8 DevObjExt 8a81bb78 Dope 8a8d7008 DevNode 8a8199b8
ExtensionFlags (0000000000)
AttachedDevice (Upper) 8a81a9e8 \Driver\ACPI
Device queue is not busy.

设备类型是设备对象的一个公开的基本属性,是系统(IO管理器)和驱动程序识别和管理设备的一个基本依据,所以它还是很重要的。

上面说的有些唱高调,对实际功能有影响么?答案也是肯定的。IO管理器和某些设备驱动程序会判断设备类型,并据其采取重要的差别对待。特别是FILE_DEVICE_DISK、FILE_DEVICE_DISK_FILE_SYSTEM和FILE_DEVICE_CD_ROM_FILE_SYSTEM这些磁盘和文件系统有关的设备类型。

另外,设备安装API(SetupAPI)也会使用设备类型ID,如果类型ID指定不当,那么可能无法正确枚举到设备实例。

终上,应该慎重选择合适的设备类型。如果确实符合已经定义了的类型,那么就用现有的,如果没有,那么DDK建议,第三方驱动程序定义的设备类型ID值应该在32768和65535之间。对于纯软件的驱动程序,就使用FILE_DEVICE_UNKNOWN(0x22)不要紧,但是不应该使用明显不符的系统类型。

IP 地址: 已记录   报告
高端调试 » 软件调试 » Windows内核调试 » 想了解不同的驱动类型ID导致的影响是什么?

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.